// A pure virtual graph class

#include <iostream>
#include <vector>
#include <limits.h>
#include <libstd>
#include <string>

using namespace std;

class Vertex;

class Edge {

 public :

  Vertex * incoming;
  Vertex * outgoing;
  int weight;
  string label;

  Edge( Vertex * in, Vertex * out, int wt, string lbl ) {
    this->incoming = in;
    this->outgoing = out;
    this->weight = wt;
    this->label = label;
  };

  ~Edge() { }

};

class Vertex {

 public :

  Vertex(string ID) {
    this->ID = ID;
  }

  ~Vertex() { }
 private:
  string ID;

}
  

  


class Graph {
  
 public :

  virtual ~Graph() { /* Do Nothing */ }

  virtual int getSize() = 0;

  virtual void removeVertex(string label) = 0;
  virtual int insertVertex(string label = "") = 0;
  virtual int containsVertex ( string )

  virtual int insertEdge(string, string) = 0;
  virtual int containsEdge( string, string) = 0;
  virtual void removeEdge(Vertex *, Vertex *) = 0;


  // Some Graph Algorithms
  virtual vector< Vertex * > BFS( string ) {
    

  
}
